﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using SistemaGO_Library.Persistencia.BD;

namespace SistemaGO_Library.Entidades.Categoria
{
    class RepositorioCategoria : IRepositorioCategoria
    {
        private BD bd = new BD();

        //Descrição: Método que é usado nas regras de negócio do sistema identificando se uma categoria que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: cod = atributo identificador de categoria que vai dizer se existe ou não.
        public bool existeCategoria(int cod) {
            string sql = "SELECT categoria_cod FROM tb_categoria_ocorrencia WHERE categoria_cod = " + cod + " ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["categoria_cod"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de uma categoria no banco de dados.
        //Valores: cat = categoria passada para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public void inserirCategoria(Categoria cat) {
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_categoria_ocorrencia (categoria_nome, categoria_descricao) ");
            sql.Append("VALUES ('" + cat.Categoria_nome + "', '" + cat.Categoria_descricao + "')");
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza busca de uma categoria no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca.
        public Categoria buscarCategoria(int cod) {
            Categoria cat = new Categoria();
            string sql = "SELECT * FROM tb_categoria_ocorrencia WHERE categoria_cod = " + cod + " ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    cat.Categoria_cod = int.Parse(dr["categoria_cod"].ToString());
                    cat.Categoria_nome = dr["categoria_nome"].ToString();
                    cat.Categoria_descricao = dr["categoria_descricao"].ToString();
                }
                return cat;
            }
        }

        //Descrição: Método que realiza alteração de uma categoria no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca de qual categoria ele irá alterar, novaCategoria = nova categoria que será inserida no lugar da antiga.
        public void alterarCategoria(int cod, Categoria novaCategoria) {
            string sql;
            sql = "UPDATE tb_categoria_ocorrencia SET categoria_nome = '" + novaCategoria.Categoria_nome + "', categoria_descricao = '" + novaCategoria.Categoria_descricao + "' WHERE categoria_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de uma categoria no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca no banco para exclusão.
        public void excluirCategoria(int cod) {
            string sql;
            sql = "DELETE FROM tb_categoria_ocorrencia WHERE categoria_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que busca o código para ser mostrado na tela.
        //Valores: nenhum, visto que ele só busca a categoria e retorna. 
        public int buscarCodigoCategoria() {
            string sql = "SELECT MAX(categoria_cod) FROM tb_categoria_ocorrencia";
            return bd.buscarCodigo(sql) + 1;
        }

        //Descrição: Método que realiza busca do nome das categorias no banco de dados.
        //Valores: nenhum, visto que ele só busca os nomes e retorna.
        public string[] buscarNomesCategorias() {
            
            string sql = "SELECT categoria_nome FROM tb_categoria_ocorrencia";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                ArrayList nomes = new ArrayList();
                while (dr.Read()) {
                    nomes.Add(dr["categoria_nome"].ToString());
                }
                string[] nomesCategorias = new string[nomes.Count];
                nomes.CopyTo(nomesCategorias);
                return nomesCategorias;
            }
        }

        //Descrição: Método que busca o código a partir do nome de uma categoria.
        //Valores: categoria = nome da categoria que será passada para realizar a busca. 
        public int buscarCodigoCategoriaPorNome(string categoria) {
            string sql = "SELECT categoria_cod FROM tb_categoria_ocorrencia WHERE categoria_nome = '" + categoria + "'";
            return bd.buscarCodigo(sql);
        }
    }
}